﻿Imports Microsoft.Reporting.WinForms.Report
Imports Microsoft.Reporting.WinForms

Public Class IReportViewer
    Inherits Microsoft.Reporting.WinForms.ReportViewer
    Dim ht As Hashtable
    Dim lst As ArrayList
    Dim dt As DataTable
    Dim ma As String = Nothing
    Dim indexDt As Integer = 0
    Dim acc As Integer = 0
    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ht = New Hashtable
        lst = New ArrayList
        ' Add any initialization after the InitializeComponent() call.
        M_Config.setDinhDangVietNam()
    End Sub
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        'Add your custom paint code here
        Try
            If acc = 0 Then
                Me.getHashTable()
                Dim dt As DataTable
                Dim Item As DictionaryEntry
                For index1 = 0 To Me.lst.Count - 1
                    For Each Item In Me.ht
                        'duyet tung dt
                        dt = CType(lst.Item(index1), DataTable)
                        For index = 0 To lst.Count - 1
                            If Item.Value = dt.TableName Then
                                'If ma IsNot Nothing Then
                                Me.LocalReport.SetParameters(New ReportParameter(Item.Value.ToString & "z" & Item.Key.ToString, dt.Rows(indexDt).Item(Item.Key).ToString))
                                'End If
                            End If
                        Next
                    Next
                Next
                acc = acc + 1
                'truyền khi hastable
                For Each Item In Me.ht
                    Me.LocalReport.SetParameters(New ReportParameter(Item.Key.ToString, Item.Value.ToString))
                Next
                Me.RefreshReport()
            End If
        Catch ex As Exception
        End Try
    End Sub
    Public Sub setParameter(ByVal tên_đối_số As String, ByVal giá_trị_đối_số As String)
        Me.ht.Add(tên_đối_số, giá_trị_đối_số)
    End Sub
    'tên đối số đặt bằng <tên bảng dữ liệu>_<tên trường>
    'nếu truyền parameter không có đối số thì mặc định lấy record đầu tiên của bảng đó
    Public Sub setParameter(ByVal dt As DataTable)
        Me.dt = dt
        Me.lst.Add(dt)
    End Sub
    'truyền mã của đối tượng thì tìm ra dòng record đó rồi lấy các đối số vô theo tên trường
    'có 2 list chứa danh sách dt và danh sách param
    Public Sub setParameter(ByVal dt As DataTable, ByVal giá_trị_mã_của_đối_tượng As String, ByVal tên_cột_mã_đối_tượng As String)

        'Me.indexDt = M_Utils.getIndexFromDataTable(mã_của_đối_tượng, tên_cột_mã_đối_tượng, dt)
        Dim dtcolone As DataTable = dt.Clone()
        'If sColumFilter IsNot Nothing Then
        'get only the rows you want
        Dim results As DataRow() = dt.Select(tên_cột_mã_đối_tượng & " ='" & giá_trị_mã_của_đối_tượng & "'")
        'Dim results As DataRow() = dt.Select("ma = 'ltp'")
        'populate new destination table
        For Each dr As DataRow In results
            dtcolone.ImportRow(dr)
        Next
        Me.dt = dtcolone
        Me.lst.Add(dt)
    End Sub
    Private Function getHashTable() As Hashtable
        Try
            Dim s As String
            For index1 = 0 To Me.LocalReport.GetParameters.Count - 1 ' duyệt param
                s = Me.LocalReport.GetParameters.Item(index1).Name
                If s.Contains("z") Or s.Contains("Z") Then
                    For index As Integer = 0 To s.Length - 1
                        If s.Chars(index).ToString() = "z" Or s.Chars(index).ToString() = "Z" Then 'duyệt lấy từng tên bảng  - param bảng
                            Me.ht.Add(s.Substring(index + 1, s.Length - index - 1).ToString, s.Substring(0, index).ToString)
                        End If
                    Next
                Else
                    'MessageBox.Show("Bạn nên coi lại cách đặt tên parameter của report (<tên bảng dữ liệu>z<tên trường>)", "Báo lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    'set trực tiếp giá trị của param vô luôn - không lấy từ bảng dữ liệu
                   
                    Return Me.ht
                    Exit Function
                End If
            Next
            Return ht
        Catch ex As Exception
            Return ht
            Exit Function
        End Try
        Return ht
    End Function

End Class
